let isIPhoneX = null;
import Vue from 'vue'
/**
 * @method getIsIPhoneX  判断是否为iphoneX
 */
const getIsIPhoneX = () => {
	return new Promise((resolve, reject) => {
		if (isIPhoneX !== null) {
			resolve(isIPhoneX);
		} else {
			uni.getSystemInfo({
				success: ({
					model,
					screenHeight
				}) => {
					const iphoneX = /iphone x/i.test(model);
					const iphoneNew = /iPhone11/i.test(model) && screenHeight === 812;
					isIPhoneX = iphoneX || iphoneNew;
					resolve(isIPhoneX);
				},
				fail: reject
			});
		}
	});
}

/**
 * @method changeQuery  obj/url格式互换
 * @param o 参数 obj/url拼接字符串
 * @param type 类型(非必填，有填时认这个处理)
 */
const changeQuery = (o,type='url') => {
	if (o == undefined) return;
	try{
		if (typeof o == 'string'||type=='obj') {
			// console.log(o)
			let obj = {}
			Object.keys(o).map(function(key) {
				obj[decodeURIComponent(key)] = decodeURIComponent(o[key])
			});
			return obj;
		} else {
			let params = Object.keys(o).map(function(key) {
				return encodeURIComponent(key) + "=" + encodeURIComponent(o[key]);
			}).join("&");
			return params;
		}
	}catch(err){
		return '';
	}
}
/**
 * @method toPage  页面跳转
 * @param url 跳转路径
 * @param query 携带参数
 * @param type 改参数仅在url为'pages/index/index'时用到，用于区分是跳转到哪个组件页面
 */
const toPage = function(url, query = {}, type) {
	url += (JSON.stringify(query) != '{}' ? '?' + changeQuery(query) : '');
	// console.log(url, query, type,changeQuery(query))
	return new Promise((resolve, reject) => {
		const app = getApp();
		if (type == 'back') {
			uni.navigateBack({
				success: (res) => {
					Vue.prototype.hideLoading('clear');
					resolve(true);
				},
				fail: reject
			})
		} else {
			app._log(url)
			var result = url.match(/^((\/pages\/index\/)|(\/components\/tab_))/g); // 页面组件的
			app._log(result)
			if (result) { // 跳转到首页
				let routes = getCurrentPages(); // 获取当前打开过的页面路由数组
				let { route } = routes[routes.length - 1] // 获取当前页面路由，也就是最后一个打开的页面路由
				if (url.match(/^(\/components\/tab_index)/g)) {
					toPage('/pages/index/index', query, 0)
				} else if (url.match(/^(\/components\/tab_view)/g)) {
					toPage('/pages/index/index', query, 1)
				} else if (url.match(/^(\/components\/tab_message)/g)) {
					toPage('/pages/index/index', query, 2)
				} else if (url.match(/^(\/components\/tab_mine)/g)) {
					toPage('/pages/index/index', query, 3)
				} else if (type >= 0 && type <= 4) {
					if (Number(type) != app.globalData.currentTab) {
						app.globalData.currentTab = Number(type);
					}
				}
				if (route != 'pages/index/index') { // 不在当前页的跳到当前页
					uni.redirectTo({
						url: '/pages/index/index'+(JSON.stringify(query) != '{}' ? '?' + changeQuery(query) : ''),
						success: res => {
						Vue.prototype.hideLoading('clear');
							resolve(true);
						},
						fail: err => {
							app._log(err)
							uni.showToast({
								title: '跳转页面不存在',
								icon: 'none'
							})
							reject(err);
						}
					})
				}
			} else if (type == 'redirect') {
				uni.redirectTo({
					url,
					success: res => {
						Vue.prototype.hideLoading('clear');
						resolve(true);
					},
					fail: err => {
						app._log(err)
						uni.showToast({
							title: '跳转页面不存在',
							icon: 'none'
						})
						reject(err);
					}
				})
			} else {
				uni.navigateTo({
					url,
					success: res => {
						Vue.prototype.hideLoading('clear');
						resolve(true);
					},
					fail: err => {
						app._log(err)
						uni.showToast({
							title: '跳转页面不存在',
							icon: 'none'
						})
						reject(err);
					}
				})
			}
		}
	});
}
/**
 * @method shareApp  分享封装
 * @param url 跳转页面的url
 * @param query 分享参数
 * @param title 分享文字
 * @param imageUrl 分享图片
 */
const shareApp = function(url, query = {}, title, imageUrl) {
	let app = getApp();
	let path = url || '/pages/index/index';
	//拼接url的参数
	if (JSON.stringify(query) != "{}") {
		var urlArgs = path + '?';
		for (var key in query) {
			urlArgs += `${key}=${query[key]}&}`
		}
		path = urlArgs.substring(0, urlArgs.length - 1)
	}
	// console.log(path)
	return {
		title: title || null,
		path: path,
		imageUrl: imageUrl || null
	}
}


const formatNumber = n => {
	n = n.toString()
	return n[1] ? n : '0' + n
}

/**
 * 格式化日期格式 (用于兼容ios Date对象)
 */
const formatDate = function(time) {
	// 将xxxx-xx-xx的时间格式，转换为 xxxx/xx/xx的格式 
	return time.replace(/\-/g, "/");
}
// 获取新时间
const setNewdate = function(interval, number, date) {
	number= Number(number)//此处得加上去，巨坑！！！
	// console.log(interval, number, date)
	/* 
	 *---------------  DateAdd(interval,number,date)  ----------------- 
	 *  DateAdd(interval,number,date)  
	 *  功能:实现VBScript的DateAdd功能. 
	 *  参数:interval,字符串表达式，表示要添加的时间间隔. 
	 *  参数:number,数值表达式，表示要添加的时间间隔的个数. 
	 *  参数:date,时间对象. 
	 *  返回:新的时间对象. 
	 *  var  now  =  new  Date(); 
	 *  var  newDate  =  DateAdd( "d ",5,now); 
	 *  author:wanghr100(灰豆宝宝.net) 
	 *  update:2004-5-28  11:46 
	 *---------------  DateAdd(interval,number,date)  ----------------- 
	 */
	switch (interval) {
		case "y":
			{
				date.setFullYear(date.getFullYear() + number);
				return date;
				break;
			}
		case "q":
			{
				date.setMonth(date.getMonth() + number * 3);
				return date;
				break;
			}
		case "m":
			{
				date.setMonth(date.getMonth() + number);
				return date;
				break;
			}
		case "w":
			{
				date.setDate(date.getDate() + number * 7);
				return date;
				break;
			}
		case "d":
			{
				date.setDate(date.getDate() + number);
				return date;
				break;
			}
		case "h":
			{
				date.setHours(date.getHours() + number);
				return date;
				break;
			}
		case "M":
			{
				date.setMinutes(date.getMinutes() + number);
				return date;
				break;
			}
		case "s":
			{
				date.setSeconds(date.getSeconds() + number);
				return date;
				break;
			}
		default:
			{
				date.setDate(date.getDate() + number);
				return date;
				break;
			}
	}
}
const format = function(date,format) {
	// console.log(date,format)
	// //使用方法 
	// var now = new Date(); 
	// var nowStr = now.format("yyyy-MM-dd hh:mm:ss"); 
	// //使用方法2: 
	// var testDate = new Date(); 
	// var testStr = testDate.format("YYYY年MM月dd日hh小时mm分ss秒"); 
	// alert(testStr); 
	// //示例： 
	// alert(new Date().Format("yyyy年MM月dd日")); 
	// alert(new Date().Format("MM/dd/yyyy")); 
	// alert(new Date().Format("yyyyMMdd")); 
	// alert(new Date().Format("yyyy-MM-dd hh:mm:ss"));
	var o = {
		"M+": date.getMonth() + 1, //month
		"d+": date.getDate(), //day
		"h+": date.getHours(), //hour
		"m+": date.getMinutes(), //minute
		"s+": date.getSeconds(), //second
		"q+": Math.floor((date.getMonth() + 3) / 3), //quarter
		"S": date.getMilliseconds() //millisecond
	}
	if (/(y+)/.test(format))
		format = format.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
	for (var k in o)
		if (new RegExp("(" + k + ")").test(format))
			format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
	return format;
}



/**
 * @method getDistance  位置测距
 * @param lat1 A点纬度
 * @param lng1 A点经度
 * @param lat2 B点纬度
 * @param lng2 B点经度
 * @param exactValue 精度
 * @param type 类型 为str时返回文本
 */
const getDistance = function(lat1, lng1, lat2, lng2, exactValue = 3,type) {
	// console.log(lat1, lng1, lat2, lng2, exactValue ,type)
	if(Number(lat1)==0) return;//为空时返回
	//经纬度转换成三角函数中度分表形式。
	lat1 = Number(lat1)
	lng1 = Number(lng1)
	lat2 = Number(lat2)
	lng2 = Number(lng2)
	function rad(d) {
		return d * Math.PI / 180.0;
	}
	var radLat1 = rad(lat1);
	var radLat2 = rad(lat2);
	var a = radLat1 - radLat2;
	var b = rad(lng1) - rad(lng2);
	var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(
		b / 2), 2)));
	s = s * 6378.137; // EARTH_RADIUS;
	s = Math.round(s * 10000) / 10000;
	//输出为公里
	let lengthStr = parseFloat(s.toFixed(exactValue)).toString();// 去掉小数点后的0
	// console.log(s)
	if(type=='str'){
		if(lengthStr.indexOf('.')!=-1){ //
			let arr = lengthStr.split('.')
			s = arr[0]+'.'+arr[1]+'km'
		}else{
			s =lengthStr+'m'
		}
	}else{
		s = lengthStr.split('.'); 
	}
	return s;
}
const deepClone = function(arr) { // 深拷贝
  if (typeof arr === 'object') {
    const cloneArr = Array.isArray(arr) ? [] : {}
    for (const key in arr) {
      cloneArr[key] = deepClone(arr[key])
    }
    return cloneArr
  } else {
    return arr
  }
}



// 设置手机号不要全局显示
const setPhone = function(num){
	if(!num)return;
	num = num.toString();
	return num.substring(0,3)+'****'+num.substring(7,11);
}


// 图片选择图片
const chooseImage = function({count=9,sizeType=['original','compressed'],sourceType=['album','camera']},success,fail,complete){
	uni.chooseImage({
		count, // 图片数量
		sizeType, // 图片质量
		sourceType, // 图片来源
		success:res=>{
			// console.log('图片上传1',res)
			success&&success(res)
		},
		fail:err=>{
			// console.log(err)
			fail&&fail(err)
		},
		complete:res=>{
			// console.log(res)
			complete&&complete(res)
		}
	})
}

	// 生成随机数
const random_string = function(len=32) {
　　var chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';   
　　var maxPos = chars.length;
　　var pwd = '';
　　for (let i = 0; i < len; i++) {
	　　pwd += chars.charAt(Math.floor(Math.random() * maxPos));
	}
	return pwd;
}

module.exports = {
	getIsIPhoneX,
	changeQuery,
	toPage,
	shareApp,
	formatNumber,
	formatDate,
	setNewdate,
	format,
	getDistance,
	deepClone,
	setPhone,
	chooseImage,
	random_string
}
